home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / program / tcpdumpb.zip / print-smb.c < prev    next >
C/C++ Source or Header  |  1996-10-07  |  29KB  |  980 lines

  1. /* 
  2.    Copyright (C) Andrew Tridgell 1995
  3.    
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 2 of the License, or
  7.    (at your option) any later version.
  8.    
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.    
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software
  16.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <sys/types.h>
  21.  
  22. #include "smb.h"
  23.  
  24. static int request=0;
  25.  
  26. uchar *startbuf=NULL;
  27.  
  28. struct smbdescript
  29. {
  30.   char *req_f1;
  31.   char *req_f2;
  32.   char *rep_f1;
  33.   char *rep_f2;
  34.   void (*fn)();
  35. };
  36.  
  37. struct smbfns
  38. {
  39.   int id;
  40.   char *name;
  41.   int flags;
  42.   struct smbdescript descript;
  43. };
  44.  
  45. #define DEFDESCRIPT  {NULL,NULL,NULL,NULL,NULL}
  46.  
  47. #define FLG_CHAIN (1<<0)
  48.  
  49. static struct smbfns *smbfind(int id,struct smbfns *list)
  50. {
  51.   int sindex;
  52.  
  53.   for (sindex=0;list[sindex].name;sindex++) 
  54.     if (list[sindex].id == id) return(&list[sindex]);
  55.  
  56.   return(&list[0]);
  57. }
  58.  
  59. static void trans2_findfirst(uchar *param,uchar *data,int pcnt,int dcnt)
  60. {
  61.   char *fmt;
  62.  
  63.   if (request) {
  64.     fmt = "Attribute=[A]\nSearchCount=[d]\nFlags=[w]\nLevel=[dP5]\nFile=[S]\n";
  65.   } else {
  66.     fmt = "Handle=[w]\nCount=[d]\nEOS=[w]\nEoffset=[d]\nLastNameOfs=[w]\n";
  67.   }
  68.  
  69.   fdata(param,fmt,param+pcnt);
  70.   if (dcnt) {
  71.     printf("data:\n");
  72.     print_data(data,dcnt);
  73.   }
  74. }
  75.  
  76. static void trans2_qfsinfo(uchar *param,uchar *data,int pcnt,int dcnt)
  77. {
  78.   static int level=0;
  79.   char *fmt="";
  80.  
  81.   if (request) {
  82.     level = SVAL(param,0);
  83.     fmt = "InfoLevel=[d]\n";
  84.     fdata(param,fmt,param+pcnt);
  85.   } else {
  86.     switch (level) {
  87.     case 1:
  88.       fmt = "idFileSystem=[W]\nSectorUnit=[D]\nUnit=[D]\nAvail=[D]\nSectorSize=[d]\n";
  89.       break;
  90.     case 2:
  91.       fmt = "CreationTime=[T2]VolNameLength=[B]\nVolumeLabel=[s12]\n";
  92.       break;
  93.     case 0x105:
  94.       fmt = "Capabilities=[W]\nMaxFileLen=[D]\nVolNameLen=[D]\nVolume=[S]\n";
  95.       break;
  96.     default:
  97.       fmt = "UnknownLevel\n";
  98.     }
  99.     fdata(data,fmt,data+dcnt);
  100.   }
  101.   if (dcnt) {
  102.     printf("data:\n");
  103.     print_data(data,dcnt);
  104.   }
  105. }
  106.  
  107. struct smbfns trans2_fns[] = {
  108. {0,"TRANSACT2_OPEN",0,
  109.    {"Flags2=[w]\nMode=[w]\nSearchAttrib=[A]\nAttrib=[A]\nTime=[T2]\nOFun=[w]\nSize=[D]\nRes=([w,w,w,w,w])\nPath=[S]",NULL,
  110.     "Handle=[d]\nAttrib=[A]\nTime=[T2]\nSize=[D]\nAccess=[w]\nType=[w]\nState=[w]\nAction=[w]\nInode=[W]\nOffErr=[d]\n|EALength=[d]\n",NULL,NULL}},
  111.  
  112. {1,"TRANSACT2_FINDFIRST",0,
  113.    {NULL,NULL,NULL,NULL,trans2_findfirst}},
  114.  
  115. {2,"TRANSACT2_FINDNEXT",0,DEFDESCRIPT},
  116.  
  117. {3,"TRANSACT2_QFSINFO",0,
  118.    {NULL,NULL,NULL,NULL,trans2_qfsinfo}},
  119.  
  120. {4,"TRANSACT2_SETFSINFO",0,DEFDESCRIPT},
  121. {5,"TRANSACT2_QPATHINFO",0,DEFDESCRIPT},
  122. {6,"TRANSACT2_SETPATHINFO",0,DEFDESCRIPT},
  123. {7,"TRANSACT2_QFILEINFO",0,DEFDESCRIPT},
  124. {8,"TRANSACT2_SETFILEINFO",0,DEFDESCRIPT},
  125. {9,"TRANSACT2_FSCTL",0,DEFDESCRIPT},
  126. {10,"TRANSACT2_IOCTL",0,DEFDESCRIPT},
  127. {11,"TRANSACT2_FINDNOTIFYFIRST",0,DEFDESCRIPT},
  128. {12,"TRANSACT2_FINDNOTIFYNEXT",0,DEFDESCRIPT},
  129. {13,"TRANSACT2_MKDIR",0,DEFDESCRIPT},
  130. {-1,NULL,0,DEFDESCRIPT}};
  131.  
  132.  
  133. static void print_trans2(uchar *words,uchar *dat,uchar *buf,uchar *maxbuf)
  134. {
  135.   static struct smbfns *fn = &trans2_fns[0];
  136.   uchar *data,*param;
  137.   uchar *f1=NULL,*f2=NULL;
  138.   int pcnt,dcnt;
  139.  
  140.   if (request) {
  141.     fn = smbfind(SVAL(words+1,14*2),trans2_fns);
  142.     data = buf+SVAL(words+1,12*2);
  143.     param = buf+SVAL(words+1,10*2);
  144.     pcnt = SVAL(words+1,9*2);
  145.     dcnt = SVAL(words+1,11*2);
  146.   } else {
  147.     data = buf+SVAL(words+1,7*2);
  148.     param = buf+SVAL(words+1,4*2);
  149.     pcnt = SVAL(words+1,3*2);
  150.     dcnt = SVAL(words+1,6*2);
  151.   }
  152.  
  153.   printf("%s param_length=%d data_length=%d\n",
  154.      fn->name,pcnt,dcnt);
  155.  
  156.   if (request) {
  157.     if (CVAL(words,0) == 8) {
  158.       fdata(words+1,"Trans2Secondary\nTotParam=[d]\nTotData=[d]\nParamCnt=[d]\nParamOff=[d]\nParamDisp=[d]\nDataCnt=[d]\nDataOff=[d]\nDataDisp=[d]\nHandle=[d]\n",maxbuf);
  159.       return;        
  160.     } else {
  161.       fdata(words+1,"TotParam=[d]\nTotData=[d]\nMaxParam=[d]\nMaxData=[d]\nMaxSetup=[d]\nFlags=[w]\nTimeOut=[D]\nRes1=[w]\nParamCnt=[d]\nParamOff=[d]\nDataCnt=[d]\nDataOff=[d]\nSetupCnt=[d]\n",words+1+14*2);
  162.       fdata(data+1,"TransactionName=[S]\n%",maxbuf);
  163.     }
  164.     f1 = fn->descript.req_f1;
  165.     f2 = fn->descript.req_f2;
  166.   } else {
  167.     if (CVAL(words,0) == 0) {
  168.       printf("Trans2Interim\n");
  169.       return;
  170.     } else {
  171.       fdata(words+1,"TotParam=[d]\nTotData=[d]\nRes1=[w]\nParamCnt=[d]\nParamOff=[d]\nParamDisp[d]\nDataCnt=[d]\nDataOff=[d]\nDataDisp=[d]\nSetupCnt=[d]\n",words+1+10*2);
  172.     }
  173.     f1 = fn->descript.rep_f1;
  174.     f2 = fn->descript.rep_f2;
  175.   }
  176.  
  177.   if (fn->descript.fn) {
  178.     fn->descript.fn(param,data,pcnt,dcnt);
  179.   } else {
  180.     fdata(param,f1?f1:(uchar*)"Paramaters=\n",param+pcnt);
  181.     fdata(data,f2?f2:(uchar*)"Data=\n",data+dcnt);      
  182.   }
  183. }
  184.  
  185.  
  186. static void print_browse(uchar *param,int paramlen,uchar *data,int datalen)
  187. {
  188.   uchar *maxbuf = data + datalen;
  189.   int command = CVAL(data,0);
  190.  
  191.   fdata(param,"BROWSE PACKET\n|Param ",param+paramlen);
  192.  
  193.   switch (command) {
  194.   case 0xF:
  195.     data = fdata(data,"BROWSE PACKET:\nType=[B] (LocalMasterAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nElectionVersion=[w]\nBrowserConstant=[w]\n",maxbuf);
  196.     break;
  197.     
  198.   case 0x1:
  199.     data = fdata(data,"BROWSE PACKET:\nType=[B] (HostAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nElectionVersion=[w]\nBrowserConstant=[w]\n",maxbuf);
  200.     break;
  201.     
  202.   case 0x2:
  203.     data = fdata(data,"BROWSE PACKET:\nType=[B] (AnnouncementRequest)\nFlags=[B]\nReplySystemName=[S]\n",maxbuf);
  204.     break;
  205.     
  206.   case 0xc:
  207.     data = fdata(data,"BROWSE PACKET:\nType=[B] (WorkgroupAnnouncement)\nUpdateCount=[w]\nRes1=[B]\nAnnounceInterval=[d]\nName=[n2]\nMajorVersion=[B]\nMinorVersion=[B]\nServerType=[W]\nCommentPointer=[W]\nServerName=[S]\n",maxbuf);
  208.     break;
  209.  
  210.   case 0x8:
  211.     data = fdata(data,"BROWSE PACKET:\nType=[B] (ElectionFrame)\nElectionVersion=[B]\nOSSummary=[W]\nUptime=[(W,W)]\nServerName=[S]\n",maxbuf);
  212.     break;
  213.     
  214.   case 0xb:
  215.     data = fdata(data,"BROWSE PACKET:\nType=[B] (BecomeBackupBrowser)\nName=[S]\n",maxbuf);
  216.     break;
  217.     
  218.   case 0x9:
  219.     data = fdata(data,"BROWSE PACKET:\nType=[B] (GetBackupList)\nListCount?=[B]\nToken?=[B]\n",maxbuf);
  220.     break;
  221.     
  222.   case 0xa:
  223.     data = fdata(data,"BROWSE PACKET:\nType=[B] (BackupListResponse)\nServerCount?=[B]\nToken?=[B]*Name=[S]\n",maxbuf);
  224.     break;
  225.     
  226.   case 0xd:
  227.     data = fdata(data,"BROWSE PACKET:\nType=[B] (MasterAnnouncement)\nMasterName=[S]\n",maxbuf);
  228.     break;
  229.     
  230.   case 0xe:
  231.     data = fdata(data,"BROWSE PACKET:\nType=[B] (ResetBrowser)\nOptions=[B]\n",maxbuf);
  232.     break;
  233.     
  234.   default:
  235.     data = fdata(data,"Unknown Browser Frame ",maxbuf);
  236.     break;
  237.   }
  238. }
  239.  
  240.  
  241. static void print_ipc(uchar *param,int paramlen,uchar *data,int datalen)
  242. {
  243.   int command = SVAL(param,0);
  244.   if (paramlen)
  245.     fdata(param,"Command=[w]\nStr1=[S]\nStr2=[S]\n",param+paramlen);
  246.   if (datalen)
  247.     fdata(data,"IPC ",data+datalen);
  248. }
  249.  
  250.  
  251. static void print_trans(uchar *words,uchar *data1,uchar *buf,uchar *maxbuf)
  252. {
  253.   uchar *f1,*f2,*f3,*f4;
  254.   uchar *data,*param;
  255.   int datalen,paramlen;
  256.   int buflen = SVAL(data1,0);
  257.  
  258.   if (request) {
  259.     paramlen = SVAL(words+1,9*2);
  260.     param = buf + SVAL(words+1,10*2);
  261.     datalen = SVAL(words+1,11*2);
  262.     data = buf + SVAL(words+1,12*2);
  263.     f1 = "TotParamCnt=[d] \nTotDataCnt=[d] \nMaxParmCnt=[d] \nMaxDataCnt=[d]\nMaxSCnt=[d] \nTransFlags=[w] \nRes1=[w] \nRes2=[w] \nRes3=[w]\nParamCnt=[d] \nParamOff=[d] \nDataCnt=[d] \nDataOff=[d] \nSUCnt=[d]\n";
  264.     f2 = "|Name=[S]\n";
  265.     f3 = "|Param ";
  266.     f4 = "|Data ";
  267.   } else {
  268.     paramlen = SVAL(words+1,3*2);
  269.     param = buf + SVAL(words+1,4*2);
  270.     datalen = SVAL(words+1,6*2);
  271.     data = buf + SVAL(words+1,7*2);
  272.     f1 = "TotParamCnt=[d] \nTotDataCnt=[d] \nRes1=[d]\nParamCnt=[d] \nParamOff=[d] \nRes2=[d] \nDataCnt=[d] \nDataOff=[d] \nRes3=[d]\nLsetup=[d]\n";
  273.     f2 = "|Unknown ";
  274.     f3 = "|Param ";
  275.     f4 = "|Data ";
  276.   }
  277.  
  278.   fdata(words+1,f1,MIN(words+1+2*CVAL(words,0),maxbuf));
  279.   fdata(data1+2,f2,maxbuf - (paramlen + datalen));
  280.  
  281.   if (!strcmp(data1+2,"\\MAILSLOT\\BROWSE")) {
  282.     print_browse(param,paramlen,data,datalen);
  283.     return;
  284.   }
  285.  
  286.   if (!strcmp(data1+2,"\\PIPE\\LANMAN")) {
  287.     print_ipc(param,paramlen,data,datalen);
  288.     return;
  289.   }
  290.  
  291.   if (paramlen) fdata(param,f3,MIN(param+paramlen,maxbuf));
  292.   if (datalen) fdata(data,f4,MIN(data+datalen,maxbuf));
  293. }
  294.  
  295.  
  296.  
  297. void print_negprot(uchar *words,uchar *data,uchar *buf,uchar *maxbuf)
  298. {
  299.   uchar *f1=NULL,*f2=NULL;
  300.  
  301.   if (request) {
  302.     f2 = "*|Dialect=[Z]\n";
  303.   } else {
  304.     if (CVAL(words,0) == 1) {
  305.       f1 = "Core Protocol\nDialectIndex=[d]";
  306.     } else if (CVAL(words,0) == 17) {
  307.       f1 = "NT1 Protocol\nDialectIndex=[d]\nSecMode=[B]\nMaxMux=[d]\nNumVcs=[d]\nMaxBuffer=[D]\nRawSize=[D]\nSessionKey=[W]\nCapabilities=[W]\nServerTime=[T3]TimeZone=[d]\nCryptKey=";
  308.     } else if (CVAL(words,0) == 13) {
  309.       f1 = "Coreplus/Lanman1/Lanman2 Protocol\nDialectIndex=[d]\nSecMode=[w]\nMaxXMit=[d]\nMaxMux=[d]\nMaxVcs=[d]\nBlkMode=[w]\nSessionKey=[W]\nServerTime=[T1]TimeZone=[d]\nRes=[W]\nCryptKey=";
  310.     }
  311.   }
  312.  
  313.   if (f1) 
  314.     fdata(words+1,f1,MIN(words + 1 + CVAL(words,0)*2,maxbuf));
  315.   else
  316.     print_data(words+1,MIN(CVAL(words,0)*2,PTR_DIFF(maxbuf,words+1)));
  317.   
  318.   if (f2) 
  319.     fdata(data+2,f2,MIN(data + 2 + SVAL(data,0),maxbuf));
  320.   else
  321.     print_data(data+2,MIN(SVAL(data,0),PTR_DIFF(maxbuf,data+2)));
  322.     
  323. }
  324.  
  325. void print_sesssetup(uchar *words,uchar *data,uchar *buf,uchar *maxbuf)
  326. {
  327.   int wcnt = CVAL(words,0);
  328.   uchar *f1=NULL,*f2=NULL;
  329.  
  330.   if (request) {
  331.     if (wcnt==10) {
  332.       f1 = "Com2=[w]\nOff2=[d]\nBufSize=[d]\nMpxMax=[d]\nVcNum=[d]\nSessionKey=[W]\nPassLen=[d]\nCryptLen=[d]\nCryptOff=[d]\nPass&Name=\n";
  333.     } else {
  334.       f1 = "Com2=[B]\nRes1=[B]\nOff2=[d]\nMaxBuffer=[d]\nMaxMpx=[d]\nVcNumber=[d]\nSessionKey=[W]\nCaseInsensitivePasswordLength=[d]\nCaseSensitivePasswordLength=[d]\nRes=[W]\nCapabilities=[W]\nPass1&Pass2&Account&Domain&OS&LanMan=\n";
  335.     }
  336.   } else {
  337.     if (CVAL(words,0) == 3) {
  338.       f1 = "Com2=[w]\nOff2=[d]\nAction=[w]\n";
  339.     } else if (CVAL(words,0) == 13) {
  340.       f1 = "Com2=[B]\nRes=[B]\nOff2=[d]\nAction=[w]\n";
  341.       f2 = "NativeOS=[S]\nNativeLanMan=[S]\nPrimaryDomain=[S]\n";
  342.     }
  343.   }
  344.  
  345.   if (f1) 
  346.     fdata(words+1,f1,MIN(words + 1 + CVAL(words,0)*2,maxbuf));
  347.   else
  348.     print_data(words+1,MIN(CVAL(words,0)*2,PTR_DIFF(maxbuf,words+1)));
  349.   
  350.   if (f2) 
  351.     fdata(data+2,f2,MIN(data + 2 + SVAL(data,0),maxbuf));
  352.   else
  353.     print_data(data+2,MIN(SVAL(data,0),PTR_DIFF(maxbuf,data+2))); 
  354. }
  355.  
  356.  
  357. static struct smbfns smb_fns[] = 
  358. {
  359. {-1,"SMBunknown",0,DEFDESCRIPT},
  360.  
  361. {SMBtcon,"SMBtcon",0,
  362.    {NULL,"Path=[Z]\nPassword=[Z]\nDevice=[Z]\n",
  363.     "MaxXmit=[d]\nTreeId=[d]\n",NULL,
  364.     NULL}},
  365.  
  366.  
  367. {SMBtdis,"SMBtdis",0,DEFDESCRIPT},
  368. {SMBexit,"SMBexit",0,DEFDESCRIPT},
  369. {SMBioctl,"SMBioctl",0,DEFDESCRIPT},
  370.  
  371. {SMBecho,"SMBecho",0,
  372.    {"ReverbCount=[d]\n",NULL,
  373.     "SequenceNum=[d]\n",NULL,
  374.     NULL}},
  375.  
  376. {SMBulogoffX, "SMBulogoffX",FLG_CHAIN,DEFDESCRIPT},
  377.  
  378. {SMBgetatr,"SMBgetatr",0,
  379.    {NULL,"Path=[Z]\n",
  380.     "Attribute=[A]\nTime=[T2]Size=[D]\nRes=([w,w,w,w,w])\n",NULL,
  381.     NULL}},
  382.  
  383. {SMBsetatr,"SMBsetatr",0,
  384.    {"Attribute=[A]\nTime=[T2]Res=([w,w,w,w,w])\n","Path=[Z]\n",
  385.     NULL,NULL,NULL}},
  386.  
  387. {SMBchkpth,"SMBchkpth",0,
  388.    {NULL,"Path=[Z]\n",NULL,NULL,NULL}},
  389.  
  390. {SMBsearch,"SMBsearch",0,
  391. {"Count=[d]\nAttrib=[A]\n","Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\n",
  392. "Count=[d]\n","BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",NULL}},
  393.  
  394.  
  395. {SMBopen,"SMBopen",0,
  396.    {"Mode=[w]\nAttribute=[A]\n","Path=[Z]\n",
  397.     "Handle=[d]\nOAttrib=[A]\nTime=[T2]Size=[D]\nAccess=[w]\n",NULL,
  398.     NULL}},
  399.  
  400. {SMBcreate,"SMBcreate",0,
  401.    {"Attrib=[A]\nTime=[T2]","Path=[Z]\n",
  402.     "Handle=[d]\n",NULL,
  403.     NULL}},
  404.  
  405. {SMBmknew,"SMBmknew",0,
  406.    {"Attrib=[A]\nTime=[T2]","Path=[Z]\n",
  407.     "Handle=[d]\n",NULL,
  408.     NULL}},
  409.  
  410. {SMBunlink,"SMBunlink",0,
  411.    {"Attrib=[A]\n","Path=[Z]\n",NULL,NULL,NULL}},
  412.  
  413. {SMBread,"SMBread",0,
  414.    {"Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n",NULL,
  415.     "Count=[d]\nRes=([w,w,w,w])\n",NULL,NULL}},
  416.  
  417. {SMBwrite,"SMBwrite",0,
  418.    {"Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n",NULL,
  419.     "Count=[d]\n",NULL,NULL}},
  420.  
  421. {SMBclose,"SMBclose",0,
  422.    {"Handle=[d]\nTime=[T2]",NULL,NULL,NULL,NULL}},
  423.  
  424. {SMBmkdir,"SMBmkdir",0,
  425.    {NULL,"Path=[Z]\n",NULL,NULL,NULL}},
  426.  
  427. {SMBrmdir,"SMBrmdir",0,
  428.    {NULL,"Path=[Z]\n",NULL,NULL,NULL}},
  429.  
  430. {SMBdskattr,"SMBdskattr",0,
  431. {NULL,NULL,
  432. "TotalUnits=[d]\nBlocksPerUnit=[d]\nBlockSize=[d]\nFreeUnits=[d]\nMedia=[w]\n",
  433. NULL,NULL}},
  434.  
  435. {SMBmv,"SMBmv",0,
  436.    {"Attrib=[A]\n","OldPath=[Z]\nNewPath=[Z]\n",NULL,NULL,NULL}},
  437.  
  438. /* this is a Pathworks specific call, allowing the 
  439.    changing of the root path */
  440. {pSETDIR,"SMBsetdir",0,
  441.    {NULL,"Path=[Z]\n",NULL,NULL,NULL}},
  442.  
  443. {SMBlseek,"SMBlseek",0,
  444.    {"Handle=[d]\nMode=[w]\nOffset=[D]\n","Offset=[D]\n",NULL,NULL}},
  445.  
  446. {SMBflush,"SMBflush",0,
  447.    {"Handle=[d]\n",NULL,NULL,NULL,NULL}},
  448.  
  449. {SMBsplopen,"SMBsplopen",0,
  450.    {"SetupLen=[d]\nMode=[w]\n","Ident=[Z]\n","Handle=[d]\n",NULL,NULL}},
  451.  
  452. {SMBsplclose,"SMBsplclose",0,
  453.    {"Handle=[d]\n",NULL,NULL,NULL,NULL}},
  454.  
  455. {SMBsplretq,"SMBsplretq",0,
  456.    {"MaxCount=[d]\nStartIndex=[d]\n",NULL,
  457.     "Count=[d]\nIndex=[d]\n",
  458.     "*Time=[T2]Status=[B]\nJobID=[d]\nSize=[D]\nRes=[B]Name=[s16]\n",
  459.     NULL}},
  460.  
  461. {SMBsplwr,"SMBsplwr",0,
  462.    {"Handle=[d]\n",NULL,NULL,NULL,NULL}},
  463.  
  464. {SMBlock,"SMBlock",0,
  465.    {"Handle=[d]\nCount=[D]\nOffset=[D]\n",NULL,NULL,NULL,NULL}},
  466.  
  467. {SMBunlock,"SMBunlock",0,
  468.    {"Handle=[d]\nCount=[D]\nOffset=[D]\n",NULL,NULL,NULL,NULL}},
  469.  
  470. /* CORE+ PROTOCOL FOLLOWS */
  471.  
  472. {SMBreadbraw,"SMBreadbraw",0,
  473. {"Handle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nRes=[d]\n",
  474.  NULL,NULL,NULL,NULL}},
  475.  
  476. {SMBwritebraw,"SMBwritebraw",0,
  477. {"Handle=[d]\nTotalCount=[d]\nRes=[w]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nRes2=[W]\n|DataSize=[d]\nDataOff=[d]\n",
  478. NULL,"WriteRawAck",NULL,NULL}},
  479.  
  480. {SMBwritec,"SMBwritec",0,
  481.    {NULL,NULL,"Count=[d]\n",NULL,NULL}},
  482.  
  483. {SMBwriteclose,"SMBwriteclose",0,
  484.    {"Handle=[d]\nCount=[d]\nOffset=[D]\nTime=[T2]Res=([w,w,w,w,w,w])",NULL,
  485.     "Count=[d]\n",NULL,NULL}},
  486.  
  487. {SMBlockread,"SMBlockread",0,
  488.    {"Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n",NULL,
  489.     "Count=[d]\nRes=([w,w,w,w])\n",NULL,NULL}},
  490.  
  491. {SMBwriteunlock,"SMBwriteunlock",0,
  492.    {"Handle=[d]\nByteCount=[d]\nOffset=[D]\nCountLeft=[d]\n",NULL,
  493.     "Count=[d]\n",NULL,NULL}},
  494.  
  495. {SMBreadBmpx,"SMBreadBmpx",0,
  496. {"Handle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nRes=[w]\n",
  497. NULL,
  498. "Offset=[D]\nTotCount=[d]\nRemaining=[d]\nRes=([w,w])\nDataSize=[d]\nDataOff=[d]\n",
  499. NULL,NULL}},
  500.  
  501. {SMBwriteBmpx,"SMBwriteBmpx",0,
  502. {"Handle=[d]\nTotCount=[d]\nRes=[w]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nRes2=[W]\nDataSize=[d]\nDataOff=[d]\n",NULL,
  503. "Remaining=[d]\n",NULL,NULL}},
  504.  
  505. {SMBwriteBs,"SMBwriteBs",0,
  506.    {"Handle=[d]\nTotCount=[d]\nOffset=[D]\nRes=[W]\nDataSize=[d]\nDataOff=[d]\n",NULL,
  507.     "Count=[d]\n",NULL,NULL}},
  508.  
  509. {SMBsetattrE,"SMBsetattrE",0,
  510.    {"Handle=[d]\nCreationTime=[T2]AccessTime=[T2]ModifyTime=[T2]",NULL,
  511.       NULL,NULL,NULL}},
  512.  
  513. {SMBgetattrE,"SMBgetattrE",0,
  514. {"Handle=[d]\n",NULL,
  515.  "CreationTime=[T2]AccessTime=[T2]ModifyTime=[T2]Size=[D]\nAllocSize=[D]\nAttribute=[A]\n",NULL,NULL}},
  516.  
  517. {SMBtranss,"SMBtranss",0,DEFDESCRIPT},
  518. {SMBioctls,"SMBioctls",0,DEFDESCRIPT},
  519.  
  520. {SMBcopy,"SMBcopy",0,
  521.    {"TreeID2=[d]\nOFun=[w]\nFlags=[w]\n","Path=[S]\nNewPath=[S]\n",
  522.     "CopyCount=[d]\n","|ErrStr=[S]\n",NULL}},
  523.  
  524. {SMBmove,"SMBmove",0,
  525.    {"TreeID2=[d]\nOFun=[w]\nFlags=[w]\n","Path=[S]\nNewPath=[S]\n",
  526.     "MoveCount=[d]\n","|ErrStr=[S]\n",NULL}},
  527.  
  528. {SMBopenX,"SMBopenX",FLG_CHAIN,
  529. {"Com2=[w]\nOff2=[d]\nFlags=[w]\nMode=[w]\nSearchAttrib=[A]\nAttrib=[A]\nTime=[T2]OFun=[w]\nSize=[D]\nTimeOut=[D]\nRes=[W]\n","Path=[S]\n",
  530. "Com2=[w]\nOff2=[d]\nHandle=[d]\nAttrib=[A]\nTime=[T2]Size=[D]\nAccess=[w]\nType=[w]\nState=[w]\nAction=[w]\nFileID=[W]\nRes=[w]\n",NULL,NULL}},
  531.  
  532. {SMBreadX,"SMBreadX",FLG_CHAIN,
  533. {"Com2=[w]\nOff2=[d]\nHandle=[d]\nOffset=[D]\nMaxCount=[d]\nMinCount=[d]\nTimeOut=[D]\nCountLeft=[d]\n",NULL,
  534. "Com2=[w]\nOff2=[d]\nRemaining=[d]\nRes=[W]\nDataSize=[d]\nDataOff=[d]\nRes=([w,w,w,w])\n",NULL,NULL}},
  535.  
  536. {SMBwriteX,"SMBwriteX",FLG_CHAIN,
  537. {"Com2=[w]\nOff2=[d]\nHandle=[d]\nOffset=[D]\nTimeOut=[D]\nWMode=[w]\nCountLeft=[d]\nRes=[w]\nDataSize=[d]\nDataOff=[d]\n",NULL,
  538. "Com2=[w]\nOff2=[d]\nCount=[d]\nRemaining=[d]\nRes=[W]\n",NULL,NULL}},
  539.  
  540. {SMBlockingX,"SMBlockingX",FLG_CHAIN,
  541. {"Com2=[w]\nOff2=[d]\nHandle=[d]\nLockType=[w]\nTimeOut=[D]\nUnlockCount=[d]\nLockCount=[d]\n",
  542. "*Process=[d]\nOffset=[D]\nLength=[D]\n",
  543. "Com2=[w]\nOff2=[d]\n"}},
  544.  
  545. {SMBffirst,"SMBffirst",0,
  546. {"Count=[d]\nAttrib=[A]\n","Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\n",
  547. "Count=[d]\n","BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",NULL}},
  548.  
  549. {SMBfunique,"SMBfunique",0,
  550. {"Count=[d]\nAttrib=[A]\n","Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\n",
  551. "Count=[d]\n","BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",NULL}},
  552.  
  553. {SMBfclose,"SMBfclose",0,
  554. {"Count=[d]\nAttrib=[A]\n","Path=[Z]\nBlkType=[B]\nBlkLen=[d]\n|Res1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\n",
  555. "Count=[d]\n","BlkType=[B]\nBlkLen=[d]\n*\nRes1=[B]\nMask=[s11]\nSrv1=[B]\nDirIndex=[d]\nSrv2=[w]\nRes2=[W]\nAttrib=[a]\nTime=[T1]Size=[D]\nName=[s13]\n",NULL}},
  556.  
  557. {SMBfindnclose, "SMBfindnclose", 0,
  558.    {"Handle=[d]\n",NULL,NULL,NULL,NULL}},
  559.  
  560. {SMBfindclose, "SMBfindclose", 0,
  561.    {"Handle=[d]\n",NULL,NULL,NULL,NULL}},
  562.  
  563. {SMBsends,"SMBsends",0,
  564.    {NULL,"Source=[Z]\nDest=[Z]\n",NULL,NULL,NULL}},
  565.  
  566. {SMBsendstrt,"SMBsendstrt",0,
  567.    {NULL,"Source=[Z]\nDest=[Z]\n","GroupID=[d]\n",NULL,NULL}},
  568.    
  569. {SMBsendend,"SMBsendend",0,
  570.    {"GroupID=[d]\n",NULL,NULL,NULL,NULL}},
  571.  
  572. {SMBsendtxt,"SMBsendtxt",0,
  573.    {"GroupID=[d]\n",NULL,NULL,NULL,NULL}},
  574.  
  575. {SMBsendb,"SMBsendb",0,
  576.    {NULL,"Source=[Z]\nDest=[Z]\n",NULL,NULL,NULL}},
  577.  
  578. {SMBfwdname,"SMBfwdname",0,DEFDESCRIPT},
  579. {SMBcancelf,"SMBcancelf",0,DEFDESCRIPT},
  580. {SMBgetmac,"SMBgetmac",0,DEFDESCRIPT},
  581.  
  582. {SMBnegprot,"SMBnegprot",0,
  583.    {NULL,NULL,NULL,NULL,print_negprot}},
  584.  
  585. {SMBsesssetupX,"SMBsesssetupX",FLG_CHAIN,
  586.    {NULL,NULL,NULL,NULL,print_sesssetup}},
  587.  
  588. {SMBtconX,"SMBtconX",FLG_CHAIN,
  589. {"Com2=[w]\nOff2=[d]\nFlags=[w]\nPassLen=[d]\nPasswd&Path&Device=\n",NULL,
  590.  "Com2=[w]\nOff2=[d]\n","ServiceType=[S]\n",NULL}},
  591.  
  592. {SMBtrans2, "SMBtrans2",0,{NULL,NULL,NULL,NULL,print_trans2}},
  593.  
  594. {SMBtranss2, "SMBtranss2", 0,DEFDESCRIPT},
  595. {SMBctemp,"SMBctemp",0,DEFDESCRIPT},
  596. {SMBreadBs,"SMBreadBs",0,DEFDESCRIPT},
  597. {SMBtrans,"SMBtrans",0,{NULL,NULL,NULL,NULL,print_trans}},
  598.  
  599. {-1,NULL,0,DEFDESCRIPT}};
  600.  
  601. /*******************************************************************
  602. print a SMB message
  603. ********************************************************************/
  604. void print_smb(uchar *buf,uchar *maxbuf)
  605. {
  606.   int command;
  607.   uchar *words, *data;
  608.   struct smbfns *fn;
  609.   char *fmt_smbheader = 
  610. "[P4]SMB Command   =  [B]\nError class   =  [BP1]\nError code    =  [d]\nFlags1        =  [B]\nFlags2        =  [B][P13]\nTree ID       =  [d]\nProc ID       =  [d]\nUID           =  [d]\nMID           =  [d]\nWord Count    =  [b]\n";
  611.  
  612.   request = (CVAL(buf,9)&0x80)?0:1;
  613.  
  614.   command = CVAL(buf,4);
  615.  
  616.   fn = smbfind(command,smb_fns);
  617.  
  618.   printf("\nSMB PACKET: %s (%s)\n",fn->name,request?"REQUEST":"REPLY");
  619.  
  620.   /* print out the header */
  621.   fdata(buf,fmt_smbheader,buf+33);
  622.  
  623.   if (CVAL(buf,5)) {
  624.     int class = CVAL(buf,5);
  625.     int num = SVAL(buf,7);
  626.     printf("SMBError = %s\n",smb_errstr(class,num));
  627.   }
  628.  
  629.   words = buf+32;
  630.   data = words + 1 + CVAL(words,0)*2;
  631.  
  632.  
  633.   while (words && data)
  634.     {
  635.       char *f1,*f2;
  636.       int wct = CVAL(words,0);
  637.  
  638.       if (request) {
  639.     f1 = fn->descript.req_f1;
  640.     f2 = fn->descript.req_f2;
  641.       } else {
  642.     f1 = fn->descript.rep_f1;
  643.     f2 = fn->descript.rep_f2;
  644.       }
  645.  
  646.       if (fn->descript.fn) {
  647.     fn->descript.fn(words,data,buf,maxbuf);
  648.       } else {
  649.     if (f1) {
  650.       printf("smbvwv[]=\n");
  651.       fdata(words+1,f1,words + 1 + wct*2);
  652.     } else if (wct) {
  653.       int i;
  654.       int v;
  655.       printf("smbvwv[]=\n");
  656.       for (i=0;i<wct;i++) {
  657.         v = SVAL(words+1,2*i);
  658.         printf("smb_vwv[%d]=%d (0x%X)\n",i,v,v);
  659.       }
  660.     }
  661.     
  662.     if (f2) {
  663.       printf("smbbuf[]=\n");
  664.       fdata(data+2,f2,maxbuf);
  665.     } else {
  666.       int bcc = SVAL(data,0);
  667.       printf("smb_bcc=%d\n",bcc);
  668.       if (bcc>0) {
  669.         printf("smb_buf[]=\n");
  670.         print_data(data+2,MIN(bcc,PTR_DIFF(maxbuf,data+2)));
  671.       }
  672.     }
  673.       }
  674.  
  675.       if ((fn->flags & FLG_CHAIN) && CVAL(words,0) && SVAL(words,1)!=0xFF) {
  676.     command = SVAL(words,1);
  677.     words = buf + SVAL(words,3);
  678.     data = words + 1 + CVAL(words,0)*2;
  679.  
  680.     fn = smbfind(command,smb_fns);
  681.  
  682.     printf("\nSMB PACKET: %s (%s) (CHAINED)\n",fn->name,request?"REQUEST":"REPLY");
  683.       } else {
  684.     words = data = NULL;
  685.       }
  686.     }
  687.  
  688.   printf("\n");  
  689. }
  690.  
  691.  
  692. /*
  693.    print a NBT packet received across tcp on port 139
  694. */
  695. void nbt_tcp_print(uchar *data,uchar *maxbuf)
  696. {
  697.   int flags = CVAL(data,0);
  698.   int nbt_len = RSVAL(data,2);
  699.   startbuf = data;
  700.   if (maxbuf <= data) return;
  701.  
  702.   printf("\n>>> NBT Packet\n");
  703.  
  704.   switch (flags) {
  705.   case 0:    
  706.     data = fdata(data,"NBT Session Packet\nFlags=[rw]\nLength=[rd]\n",data+4);
  707.     if (memcmp(data,"\377SMB",4)==0) {
  708.       if (nbt_len>PTR_DIFF(maxbuf,data))
  709.     printf("WARNING: Short packet. Try increasing the snap length (%d)\n",
  710.            PTR_DIFF(maxbuf,data));
  711.       print_smb(data,maxbuf>data+nbt_len?data+nbt_len:maxbuf);
  712.     } else {
  713.       printf("Session packet:(raw data?)\n");
  714.     }
  715.     break;
  716.  
  717.   case 0x81:
  718.     data = fdata(data,"NBT Session Request\nFlags=[rW]\nDestination=[n1]\nSource=[n1]\n",maxbuf);
  719.     break;
  720.  
  721.   case 0x82:
  722.     data = fdata(data,"NBT Session Granted\nFlags=[rW]\n",maxbuf);
  723.     break;
  724.  
  725.   case 0x83:
  726.     {
  727.       int ecode = CVAL(data,4);
  728.       data = fdata(data,"NBT SessionReject\nFlags=[rW]\nReason=[B]\n",maxbuf);
  729.       switch (ecode) {
  730.       case 0x80: 
  731.     printf("Not listening on called name\n"); 
  732.     break;
  733.       case 0x81: 
  734.     printf("Not listening for calling name\n"); 
  735.     break;
  736.       case 0x82: 
  737.     printf("Called name not present\n"); 
  738.     break;
  739.       case 0x83: 
  740.     printf("Called name present, but insufficient resources\n"); 
  741.     break;
  742.       default:
  743.     printf("Unspecified error 0x%X\n",ecode); 
  744.     break;      
  745.       }
  746.     }
  747.     break;
  748.  
  749.   case 0x85:
  750.     data = fdata(data,"NBT Session Keepalive\nFlags=[rW]\n",maxbuf);
  751.     break;
  752.  
  753.   default:
  754.     data = fdata(data,"NBT - Unknown packet type\nType=[rW]\n",maxbuf);
  755.   }
  756.   printf("\n");
  757.   fflush(stdout);
  758. }
  759.  
  760.  
  761. /*
  762.    print a NBT packet received across udp on port 137
  763. */
  764. void nbt_udp137_print(uchar *data,uchar *maxbuf)
  765. {
  766.   int name_trn_id = RSVAL(data,0);
  767.   int response = (CVAL(data,2)>>7);
  768.   int opcode = (CVAL(data,2) >> 3) & 0xF;
  769.   int nm_flags = ((CVAL(data,2) & 0x7) << 4) + (CVAL(data,3)>>4);
  770.   int rcode = CVAL(data,3) & 0xF;
  771.   int qdcount = RSVAL(data,4);
  772.   int ancount = RSVAL(data,6);
  773.   int nscount = RSVAL(data,8);
  774.   int arcount = RSVAL(data,10);
  775.   char des[1024];
  776.   char *opcodestr="OPUNKNOWN";  
  777.   char *p;
  778.  
  779.   startbuf = data;
  780.  
  781.   if (maxbuf <= data) return;
  782.  
  783.   strcpy(des,"\n>>> NBT UDP PACKET(137): ");
  784.  
  785.   switch (opcode) {
  786.   case 0: opcodestr = "QUERY"; break;
  787.   case 5: opcodestr = "REGISTRATION"; break;
  788.   case 6: opcodestr = "RELEASE"; break;
  789.   case 7: opcodestr = "WACK"; break;
  790.   case 8: opcodestr = "REFRESH(8)"; break;
  791.   case 9: opcodestr = "REFRESH"; break;
  792.   }
  793.   strcat(des,opcodestr);
  794.   if (response) {
  795.     if (rcode)
  796.       strcat(des,"; NEGATIVE");
  797.     else
  798.       strcat(des,"; POSITIVE");
  799.   }
  800.     
  801.   if (response) 
  802.     strcat(des,"; RESPONSE");
  803.   else
  804.     strcat(des,"; REQUEST");
  805.  
  806.   if (nm_flags&1)
  807.     strcat(des,"; BROADCAST");
  808.   else
  809.     strcat(des,"; UNICAST");
  810.   
  811.   printf("%s\nTrnID=0x%X\nOpCode=%d\nNmFlags=0x%X\nRcode=%d\nQueryCount=%d\nAnswerCount=%d\nAuthorityCount=%d\nAddressRecCount=%d\n",
  812.      des,name_trn_id,opcode,nm_flags,rcode,qdcount,ancount,nscount,arcount);
  813.  
  814.   p = data + 12;
  815.  
  816.   {
  817.     int total = ancount+nscount+arcount;
  818.     int i;
  819.  
  820.     if (qdcount>100 || total>100) {
  821.       printf("Corrupt packet??\n");
  822.       return;
  823.     }
  824.  
  825.     if (qdcount) {
  826.       printf("QuestionRecords:\n");
  827.       for (i=0;i<qdcount;i++)
  828.     p = fdata(p,"|Name=[n1]\nQuestionType=[rw]\nQuestionClass=[rw]\n#",maxbuf);
  829.     }
  830.  
  831.     if (total) {
  832.       printf("\nResourceRecords:\n");
  833.       for (i=0;i<total;i++) {      
  834.     int rdlen;
  835.     int restype;
  836.     p = fdata(p,"Name=[n1]\n#",maxbuf);
  837.     restype = RSVAL(p,0);
  838.     p = fdata(p,"ResType=[rw]\nResClass=[rw]\nTTL=[rD]\n",p+8);
  839.     rdlen = RSVAL(p,0);
  840.     printf("ResourceLength=%d\nResourceData=\n",rdlen);
  841.     p += 2;
  842.     if (rdlen == 6) {
  843.       p = fdata(p,"AddrType=[rw]\nAddress=[b.b.b.b]\n",p+rdlen);
  844.     } else {
  845.       if (restype == 0x21) {
  846.         int numnames = CVAL(p,0);
  847.         p = fdata(p,"NumNames=[B]\n",p+1);
  848.         while (numnames--) {
  849.           char flags[128]="";
  850.           p = fdata(p,"Name=[n2]\t#",maxbuf);
  851.           if (p[0] & 0x80) strcat(flags,"<GROUP> ");
  852.           if (p[0] & 0x60 == 0) strcat(flags,"B ");
  853.           if (p[0] & 0x60 == 1) strcat(flags,"P ");
  854.           if (p[0] & 0x60 == 2) strcat(flags,"M ");
  855.           if (p[0] & 0x60 == 3) strcat(flags,"_ ");
  856.           if (p[0] & 0x10) strcat(flags,"<DEREGISTERING> ");
  857.           if (p[0] & 0x08) strcat(flags,"<CONFLICT> ");
  858.           if (p[0] & 0x04) strcat(flags,"<ACTIVE> ");
  859.           if (p[0] & 0x02) strcat(flags,"<PERMANENT> ");
  860.           printf("%s\n",flags);
  861.           p += 2;
  862.         }
  863.       } else {
  864.         print_data(p,rdlen);
  865.         p += rdlen;
  866.       }
  867.     }
  868.       }
  869.     }
  870.   }
  871.  
  872.   if ((uchar*)p < maxbuf) {
  873.     fdata(p,"AdditionalData:\n",maxbuf);    
  874.   }      
  875.   
  876.   printf("\n");
  877.   fflush(stdout);
  878. }
  879.  
  880.  
  881.  
  882. /*
  883.    print a NBT packet received across udp on port 138
  884. */
  885. void nbt_udp138_print(uchar *data,uchar *maxbuf)
  886. {
  887.   startbuf = data;
  888.   if (maxbuf <= data) return;
  889.  
  890.   data = fdata(data,"\n>>> NBT UDP PACKET(138) Res=[rw] ID=[rw] IP=[b.b.b.b] Port=[rd] Length=[rd] Res2=[rw]\nSourceName=[n1]\nDestName=[n1]\n#",maxbuf);
  891.  
  892.   print_smb(data,maxbuf);
  893.   
  894.   printf("\n");
  895.   fflush(stdout);
  896. }
  897.  
  898.  
  899.  
  900. /*
  901.    print netbeui frames 
  902. */
  903. void netbeui_print(uchar *data,uchar *maxbuf)
  904. {
  905.   int len = SVAL(data,1);
  906.   int command = CVAL(data,5);
  907.   uchar *data2 = data + 1 + len;
  908.  
  909.   startbuf = data;
  910.  
  911.   data = fdata(data,"\n>>> NetBeui Packet\nType=[B] Length=[d] Signature=[w] Command=[B]\n#",maxbuf);
  912.  
  913.   switch (command) {
  914.   case 0xA: 
  915.     data = fdata(data,"NameQuery:[P1]\nSessionNumber=[B]\nNameType=[B][P2]\nResponseCorrelator=[w]\nDestination=[n2]\nSource=[n2]\n",data2);
  916.     break;
  917.  
  918.   case 0x8:
  919.     data = fdata(data,"NetbiosDataGram:[P7]\nDestination=[n2]\nSource=[n2]\n",data2);
  920.     break;
  921.  
  922.   case 0xE:
  923.     data = fdata(data,"NameRecognise:\n[P1]\nData2=[w]\nTransmitCorrelator=[w]\nResponseCorelator=[w]\nDestination=[n2]\nSource=[n2]\n",data2);
  924.     break;
  925.  
  926.   case 0x19:
  927.     data = fdata(data,"SessionInitialise:\nData1=[B]\nData2=[w]\nTransmitCorrelator=[w]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n",data2);
  928.     break;
  929.  
  930.   case 0x17:
  931.     data = fdata(data,"SessionConfirm:\nData1=[B]\nData2=[w]\nTransmitCorrelator=[w]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n",data2);
  932.     break;
  933.  
  934.   case 0x16:
  935.     data = fdata(data,"NetbiosDataOnlyLast:\nFlags=[{|NO_ACK|PIGGYBACK_ACK_ALLOWED|PIGGYBACK_ACK_INCLUDED|}]\nResyncIndicator=[w][P2]\nResponseCorelator=[w]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n",data2);
  936.     break;
  937.  
  938.   case 0x14:
  939.     data = fdata(data,"NetbiosDataAck:\n[P3]TransmitCorrelator=[w][P2]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n",data2);
  940.     break;
  941.  
  942.   case 0x18:
  943.     data = fdata(data,"SessionEnd:\n[P1]Data2=[w][P4]\nRemoteSessionNumber=[B]\nLocalSessionNumber=[B]\n",data2);
  944.     break;
  945.  
  946.   default:
  947.     data = fdata(data,"Unknown Netbios Command ",data2);
  948.     break;
  949.   }
  950.  
  951.   if (memcmp(data2,"\377SMB",4)==0) {
  952.     print_smb(data2,maxbuf);
  953.   } else {
  954.     fdata(data2,"Extra ",maxbuf);
  955.   }
  956.  
  957.   printf("\n");
  958. }
  959.  
  960.  
  961. /*
  962.    print IPX-Netbios frames 
  963. */
  964. void ipx_netbios_print(uchar *data,uchar *maxbuf)
  965. {
  966.   /* this is a hack till I work out how to parse the rest of the IPX stuff */
  967.   int i;
  968.   startbuf = data;
  969.   for (i=0;i<128;i++)
  970.     if (memcmp(&data[i],"\377SMB",4)==0) {
  971.       fdata(data,"\n>>> IPX transport ",&data[i]);
  972.       print_smb(&data[i],maxbuf);
  973.       printf("\n");
  974.       fflush(stdout);
  975.       break;
  976.     }
  977.   if (i==128)
  978.     fdata(data,"\n>>> Unknown IPX ",maxbuf);
  979. }
  980.